#include <deque>
#include <vector>
#include <iostream>

#include "Timer.h"

using namespace std;

// 分别在 deque 以及 vector 头部，插入 200000 个元素，比较它们的性能
void testVector() {
  Timer t;

  vector<int> v;

  for (int i = 0; i < 200000; ++i) {
    auto beg = v.begin();
    v.insert(beg, i);
  }

  return;
}

void testDeque() {
  Timer t;

  deque<int> dq;

  for (int i = 0; i < 200000; ++i) {
    // auto beg = dq.begin();
    // dq.insert(beg, i);

    dq.push_front(i);
  }

  return;
}

int main(int argc, char const *argv[])
{
  testVector();
  testDeque();


  /* code */
  vector<int> v {1, 2, 3, 4, 5};

  // 如何把 v[0] 的位置打印出来
  cout << hex << &v[0] << endl;
  cout << hex << &v[1] << endl;
  cout << hex << &v[2] << endl;
  cout << hex << &v[3] << endl;
  cout << sizeof(int) << endl;

  /*
   0x600000875100 - v[0] 的地址
   0x600000875104 - v[1] 的地址 = v[0] + 4
   0x600000875108 - &v[2] = &v[1] + 4
   0x60000087510c - &v[3] = &v[2] + 4
   数组中的元素，在内存中，是紧挨着存放的。

   好处：可以任意存取数组任意位置的元素
   缺点：在非结尾的位置添加元素的时候，性能不好
   
   4 - 一个整数占据 4 个字节
   */

  // deque - 本质上它的含义和用法都和 vector 相同

  deque<int> dq {1, 2, 3, 4, 5, 6};
  // push_front / pop_front
  dq.push_front(0);

  for (int n : dq) {
    cout << n << " ";
  }
  cout << endl;

  dq.pop_front();

  for (int n : dq) {
    cout << n << " ";
  }
  cout << endl;

  dq.clear();
  
  deque<int> dq1;
  
  for (int i = 0; i < 2; ++i) {
    // dq1.push_front(i);
    auto beg = dq1.begin();
    dq1.insert(beg, i);
  }
  
  for (int n : dq1) {
    cout << n << " ";
  }
  cout << endl;

  vector<int> v1;
  
  for (int i = 0; i < 6; ++i) {
    auto beg = v1.begin();
    v1.insert(beg, i);
  }

  for (int n : v1) {
    cout << n << " ";
  }
  cout << endl;
  return 0;
}
